如果你聽說老一輩的人說『趕快去寫ACM』或是『我們曾經比過ACM拿下很好的成績』,那絕對就是國際大學生程式設計競賽沒錯啦!但其實 ACM 是美國計算機協會 (Association for Computing Machinery) 的縮寫,並不是比賽的名稱。
『國際大學生程式設計競賽』(International Collegiate Programming Contest, ICPC) 這個辦給大學生的團體賽最早是由德州 Baylor University 的 Bill Poucher 教授所召集的,最早是掛名在美國計算機協會底下稱為 ACM-ICPC,而且 ACM 贊助了 ICPC 很長很長一段時間,直到最近幾年,合作的 IBM 一直發現贊助了比賽但是得獎的選手都跑去其他公司了,因此就抽手不全盤贊助啦。因此最近幾年他們成立了 ICPC Foundation 這個組織專門舉辦這個世界級的大學生程式設計競賽。
一場 ICPC 制度的比賽是如何進行的呢?簡單來說,這是一場以『大專院校』為單位的一個國際比賽。每一支隊伍是由同一所學校的 3 名選手參加。而參賽資格並沒有系所的規定,簡單來說只要是大學入學 5 年內 (也就是說包含研究所一年級) 且不超過 23~24 歲 (其實是看出生年份) 就可以參賽,詳情可以參考大會規定。一場比賽為 5 小時,每一隊僅有 1 台電腦可以使用,題數由以前的 8~10 題近年來通貨膨脹到了 12~14 題。
根據不具名的本文章作者推測:很有可能是為了讓各種程度的參賽隊伍,在整場比賽期間都有題目可以解,所以在題目難度的光譜上增加了許多簡單至中等難度的題目。在這邊筆者想要澄清一下,世界決賽等級的題目,就算是最簡單的題目,也保證有 Leetcode Hard 等級唷,是非常非常有水準的題組。如果用 Leetcode 題目難度來衡量 ICPC 比賽的話,題目難度通常可以分為 Hard, Arduous, Intricate, Unsolvable 四個等級(誤)。某一年因傳聞 tourist (一位白俄羅斯選手,從 2006 年開始連續 7 年獲得國際資訊奧林匹亞獎牌) 參賽的關係,題目難度暴增。但其實當年他並沒有以選手身份參賽而是以教練身份指導聖彼得堡機械與光學大學 (ITMO) 指導隊伍參賽,導致全場隊伍只開出不到七成的題目...
由於是以『大專院校』為參賽單位的,因此這場比賽有一項很特別的規定,是在世界決賽的時候,每一所學校僅能有至多一隊代表參加。而至於如何晉級到世界決賽,則是由各洲的區域賽決選出來。以台灣為例,參賽隊伍可以從東北亞與東南亞幾個區域賽中,參加至多兩個區域賽。若在區域賽中獲得很好的成績,則有機會進入世界決賽 (若同一間學校有多支參賽隊伍在不同的區域賽都晉級了,最終必須透過校內 PK 賽決定誰能參加世界決賽)。
世界決賽的時候場內大概是這種氣球海飄揚的熱鬧場面~
ICPC 的計分機制非常有趣。隊伍們是透過直接上傳程式原始碼來進行答題。這幾年可以選擇使用 C++、Java、Kotlin 或 Python 撰寫程式碼。每一道題目沒有部分分數,僅有『通過全部測試資料』、或是『沒通過全部測試資料』。而計分板會將隊伍們答對每一道題目的時間記錄下來,並且將這個時間加總計入『罰分』(penalty)。此外,對於已答對的題目,若先前有上傳錯誤,則每一次錯誤 (編譯錯誤除外) 都會額外計算『20分鐘』的罰分。
隊伍們進行最終排名時,答對題數較多的隊伍排名較前,答對題數相同時,以罰分較少者排名較前。題數相同、罰分又相同的時候該怎麼辦?歷史上好像還真的發生過這件事情,而且還發生在台灣大學的隊伍上:2013 年的時候,來自台灣大學的 +1 ironwood branch 隊伍因為與排名世界第三的東京大學 (當年的開獎典禮在這邊:https://youtu.be/HljW36_k5D4?t=3446 ) 答對題數相同、罰分也意外相同、根據規則,此時根據最後答對的題目,越早者勝。很可惜東京大學比台灣大學的隊伍早了一些時間開出 8 題,最終由他們拿下第三名。
在超過一百支來自世界各地的參賽隊伍中,前四名可以獲得金牌、五到八名獲得銀牌、九到十二名獲得銅牌。此外對於各大洲的第一名隊伍也會頒發特製的紀念獎牌。最近幾年也鼓勵大家快速開題,所以對於每一道題目,率先答對的隊伍也會獲得贊助商提供的獎金和一塊A4大小的獎牌。我們通常把率先解出一題的這種行為稱為『首殺』。不過根據筆者當年 (2010 與 2012) 年的經驗,其實在比賽的當下,大家都會全力以赴,鮮少有餘力可以注意到其他隊伍或其他題目的答題狀態,因此通常不會去注意到該題有沒有拿到首殺。我們很幸運,2010 年在比賽中後段由陳柏龍學長拿到一題難題的首殺 (不過當年只有莫名其妙被打斷比賽叫起來拍合照,獎金和獎牌是 2012 年才開始有的XD)。當年首殺就是多送你一顆同樣顏色的氣球而已。而在 2012 年我們也很意外地在比賽初期拿到一題簡單題的首殺。
ICPC 比賽時的計分板,在比賽的前四個小時是完全公開的。全世界的人們都可以同步看到隊伍的上傳與評測狀況。而最後一小時的時候,計分板是凍結狀態的,我們稱之為『封板』。此時只能看到其他隊伍們在最後一小時內有沒有上傳,但是答題正確與否只有自己知道。有趣的是,場外應該可以或多或少從攝影鏡頭看出隊伍們是否有答對題目,某幾年封板階段也還會持續送氣球至現場。
近幾年的 ICPC 都會有同步的網路直播,除了會播放各隊伍的揮手短片、討論計分板發生的即時戰況以外,還會有前選手或出題裁判(出題的人通常會被邀請進入評審室擔任裁判)向大家解說每一題的題意,並且給予一些解題的方向或提示。
下面這張圖是我在網路上找到的,比較清晰:https://codeforces.com/blog/entry/88262
https://www.facebook.com/watch/live/?ref=watch_permalink&v=1829999533706370
身為 ICPC 大家長的 Bill Poucher 教授,也會在每一年的賽事舉辦,選手入場之前的集合時間,趁機把冠軍獎盃拿出來給大家聞香一下。他也會隨機把獎盃傳給大家摸,沾沾運氣。後來我在北美賽區以隨隊副教練的身份參加時,也聽過好幾次 Poucher 教授激勵人心的演說。希望台灣的隊伍有朝一日也能拿到一座冠軍獎盃!
今天先介紹到這邊,明天來聊聊 ICPC 區域賽~